import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'



// 创建一个类型, 用于对响应值不同时进行数据操作
// Ollama 生成响应类型 (用于 /generate 接口)
export interface OllamaGenerateResponse {
	model: string
	created_at: string
	response: string
	done: boolean
	done_reason: string
	context: number[]
	total_duration: number
	load_duration: number
	prompt_eval_count: number
	prompt_eval_duration: number
	eval_count: number
	eval_duration: number
}

// Ollama 模型信息类型 (用于 /tags 接口)
export interface OllamaModel {
	name: string
	model: string
	modified_at: string
	size: number
	digest: string
	details: {
		parent_model: string
		format: string
		family: string
		families: string[]
		parameter_size: string
		quantization_level: string
	}
}

// Ollama 模型列表响应类型
export interface OllamaModelsResponse {
	models: OllamaModel[]
}

// Ollama 生成请求参数类型
export interface OllamaGenerateRequest {
	model: string
	prompt: string
	stream?: boolean
	context?: number[]
	options?: {
		temperature?: number
		top_p?: number
		top_k?: number
		seed?: number
		stop?: string[]
		// 其他可选参数
	}
}


// 封装固定接口地址
const request = axios.create({
	// 备用
	// baseURL:'http://localhost:3000/api',

	// 尝试写成动态的, 对应多个端口的情况
	baseURL: import.meta.env.VITE_API_BASE_URL,
	timeout: 3600000, //超时时间
	headers: {
		'Content-Type': 'application/json;charset=UTF-8'
	}
})




// 请求拦截器
request.interceptors.request.use(
	(config: AxiosRequestConfig) => {
		// 在发送请求之前做些什么
		// 可以添加认证token
		const token = localStorage.getItem('access_token');
		if (token && config.headers) {
			config.headers.Authorization = `Bearer ${token}`;
		}

		// 添加时间戳防止缓存
		if (config.method === 'get') {
			config.params = {
				...config.params,
				_t: Date.now()
			};
		}

		return config;
	},
	(error: AxiosError) => {
		// 对请求错误做些什么
		console.error('请求错误:', error);
		return Promise.reject(error);
	}
);

// 响应拦截器
request.interceptors.response.use(
	(response: AxiosResponse<OllamaGenerateResponse | OllamaModelsResponse | any>) => {
		// 对响应数据做点什么
		const res = response?.data ?? response;

		// 根据实际后端返回的数据结构进行调整
		// 如果后端统一返回格式，可以在这里统一处理
		if (res.code && res.code !== 200) {
			// 根据不同的错误码进行处理
			switch (res.code) {
				case 401:
					// 未授权，跳转到登录页
					console.error('未授权，请重新登录');
					// 可以在这里添加跳转到登录页的逻辑
					break;
				case 403:
					console.error('拒绝访问');
					break;
				case 404:
					console.error('请求地址出错');
					break;
				case 500:
					console.error('服务器内部错误');
					break;
				default:
					console.error('未知错误:', res.message || 'Error');
					break;
			}

			return Promise.reject(new Error(res.message || 'Error'));
		} else {

			return res;
		}
	},
	(error: AxiosError) => {
		// 对响应错误做点什么
		console.error('响应错误:', error);

		if (error.response) {
			const { status } = error.response;

			switch (status) {
				case 401:
					console.error('未授权，请重新登录');
					// 可以在这里添加跳转到登录页的逻辑
					break;
				case 403:
					console.error('拒绝访问');
					break;
				case 404:
					console.error('请求地址出错');
					break;
				case 500:
					console.error('服务器内部错误');
					break;
				default:
					console.error(`错误:${status}`);
					break;
			}
		} else {
			console.error('网络错误');
		}

		return Promise.reject(error);
	}
);

// 导出axios实例
export default request;
